package com.dfe.backend.common.util;

import cn.hutool.core.util.StrUtil;
import lombok.var;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;

/**
 * 【描述】：
 *
 * @author LiChang
 * @since 2025-8-4 9:27
 */
public class ZipUtil {

    /**
     * 【描述】: 获取zip文件中的唯一文件后缀（流式处理）
     *
     * @param multipartFile multipartFile
     * @return {@link String}
     * @author LiChang
     * @since 2025-8-4 9:40
     */
    public static String getValidZipExtensionByInputStream(MultipartFile multipartFile) {
        try (InputStream is = multipartFile.getInputStream();
             ZipInputStream zis = new ZipInputStream(is)) {
            int fileCount = 0;
            String fileName = null;
            ZipEntry entry;

            // 遍历ZIP中的所有条目
            while ((entry = zis.getNextEntry()) != null) {
                // 跳过目录条目
                if (entry.isDirectory()) {
                    continue;
                }

                // 统计文件数量并记录文件名
                fileCount++;
                fileName = entry.getName();

                // 如果超过一个文件立即返回空
                if (fileCount > 1) {
                    return null;
                }
            }
            if (StrUtil.isNotEmpty(fileName)) {
                // 返回文件后缀
                return FilenameUtils.getExtension(fileName).toLowerCase();
            }
            return null;

        } catch (IOException e) {
            System.err.println("处理ZIP文件出错: " + e.getMessage());
            return null;
        }
    }


    /**
     * 【描述】: 获取zip文件中的唯一文件后缀
     *
     * @param zipFilePath zipFilePath
     * @return {@link String}
     * @author LiChang
     * @since 2025-8-4 9:35
     */
    public static String getValidZipExtension(String zipFilePath) {
        try (ZipFile zipFile = new ZipFile(zipFilePath)) {
            int fileCount = 0;
            String fileName = null;

            // 遍历ZIP中的所有条目
            var entries = zipFile.entries();
            while (entries.hasMoreElements()) {
                ZipEntry entry = entries.nextElement();

                // 跳过目录条目
                if (entry.isDirectory()) {
                    continue;
                }

                // 统计文件数量并记录文件名
                fileCount++;
                fileName = entry.getName();

                // 如果超过一个文件立即返回空
                if (fileCount > 1) {
                    return null;
                }
            }
            if (StrUtil.isNotEmpty(fileName)) {
                // 返回文件后缀
                return FilenameUtils.getExtension(fileName).toLowerCase();
            }
            return null;

        } catch (IOException e) {
            System.err.println("处理ZIP文件出错: " + e.getMessage());
            return null;
        }
    }


}
